package com.library.repository;

import com.library.entity.BorrowRecord;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.Collection;
import java.util.List;
import java.util.Optional;

/**
 * 借阅记录数据访问层接口
 * 继承JpaRepository，提供基础的CRUD操作
 * 使用JOIN FETCH优化查询，避免N+1问题
 */
@Repository
public interface BorrowRecordRepository extends JpaRepository<BorrowRecord, Long> {
    /**
     * 根据用户ID查找当前借阅记录
     * 当前借阅指状态为borrowed或pending_return的记录
     * 使用JOIN FETCH预加载关联的Book和User对象，避免懒加载问题
     * 
     * @param userId 用户ID
     * @return 当前借阅记录列表，按借阅日期倒序排列
     */
    @Query("SELECT br FROM BorrowRecord br JOIN FETCH br.book JOIN FETCH br.user " +
           "WHERE br.user.id = :userId AND br.status IN ('borrowed', 'pending_return') " +
           "ORDER BY br.borrowDate DESC")
    List<BorrowRecord> findCurrentBorrowsByUserId(@Param("userId") Long userId);

    /**
     * 根据用户ID和状态查找借阅记录
     * 支持按状态筛选，如果status为null则查询所有状态的记录
     * 
     * @param userId 用户ID
     * @param status 借阅状态（borrowed/pending_return/returned），null表示所有状态
     * @return 借阅记录列表，按借阅日期倒序排列
     */
    @Query("SELECT br FROM BorrowRecord br JOIN FETCH br.book JOIN FETCH br.user " +
           "WHERE br.user.id = :userId " +
           "AND (:status IS NULL OR br.status = :status) " +
           "ORDER BY br.borrowDate DESC")
    List<BorrowRecord> findRecordsByUserId(@Param("userId") Long userId, @Param("status") String status);

    /**
     * 查找所有当前借阅记录
     * 管理员使用，查看所有用户的当前借阅情况
     * 
     * @return 所有当前借阅记录列表，按借阅日期倒序排列
     */
    @Query("SELECT br FROM BorrowRecord br JOIN FETCH br.book JOIN FETCH br.user " +
           "WHERE br.status IN ('borrowed', 'pending_return') " +
           "ORDER BY br.borrowDate DESC")
    List<BorrowRecord> findAllCurrentBorrows();

    /**
     * 查找所有借阅记录
     * 管理员使用，支持按状态筛选
     * 
     * @param status 借阅状态，null表示所有状态
     * @return 借阅记录列表，按借阅日期倒序排列
     */
    @Query("SELECT br FROM BorrowRecord br JOIN FETCH br.book JOIN FETCH br.user " +
           "WHERE (:status IS NULL OR br.status = :status) " +
           "ORDER BY br.borrowDate DESC")
    List<BorrowRecord> findAllRecords(@Param("status") String status);

    /**
     * 根据用户ID、图书ID和状态查找借阅记录
     * 用于检查用户是否已借阅某本图书
     * 
     * @param userId 用户ID
     * @param bookId 图书ID
     * @param status 借阅状态
     * @return Optional包装的BorrowRecord对象
     */
    Optional<BorrowRecord> findByUserIdAndBookIdAndStatus(Long userId, Long bookId, String status);

    /**
     * 检查是否存在指定条件的借阅记录
     * 用于快速判断用户是否已借阅某本图书
     * 
     * @param userId 用户ID
     * @param bookId 图书ID
     * @param status 借阅状态
     * @return true表示存在，false表示不存在
     */
    boolean existsByUserIdAndBookIdAndStatus(Long userId, Long bookId, String status);

    /**
     * 检查用户是否存在未归还的借阅记录
     *
     * @param userId 用户ID
     * @param statuses 借阅状态集合
     * @return true表示存在，false表示不存在
     */
    boolean existsByUserIdAndStatusIn(Long userId, Collection<String> statuses);

    /**
     * 根据用户ID删除其所有借阅记录
     *
     * @param userId 用户ID
     */
    void deleteByUserId(Long userId);
}
